package post

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
	. "myplatform/handler"
	"myplatform/libs/errcode"
	"myplatform/libs/token"
	"myplatform/libs/valiutils"
	"myplatform/model"
	"net/http"
	"os"
	"path"
	"path/filepath"
	"strconv"
	"time"
)

// 查看所有post,接口
func Getpost(c *gin.Context) {
	if p, err := model.GetPost(); err != nil {
		//SendResponse(c, 1004, "查询数据失败", err)
		SendRsp(c, errcode.SearchError, nil)
	} else {
		SendRsp(c, errcode.OK, p)
	}
}

// 根据关键字查post
func GetPostBykey(c *gin.Context) {
	kw := c.Query("kw") //?后传参而不是根据/:kw传参
	if s, err := model.GetPostByKey(kw); err != nil {
		SendRsp(c, errcode.SearchError, nil)
		return
	} else {
		SendRsp(c, errcode.OK, s)
	}
}

// 通过帖子找类型
func GetTypeBypost(c *gin.Context) {
	id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	var p model.Post
	p.Pid = uint64(id)
	if err := p.GetTypeByPost(); err != nil {
		SendRsp(c, errcode.SearchError, nil)
		return
	}
	SendRsp(c, errcode.OK, p.Types)
}

// 根据pid找帖子
func GetPostBypid(c *gin.Context) {
	id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	if s, err := model.GetPostByPid(uint64(id)); err != nil {
		SendRsp(c, errcode.SearchError, nil)
		return
	} else {
		SendRsp(c, errcode.OK, s)
	}
}

func GetPostBypidHTML(c *gin.Context) {
	c.HTML(200, "postinfo.html", gin.H{})
}

// 根据帖子找作者
func GetWriterBypost(c *gin.Context) {
	id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	var p model.Post
	p.Pid = uint64(id)
	if err := p.GetWriterByPost(); err != nil {
		SendRsp(c, errcode.SearchError, nil)
		return
	}
	SendRsp(c, errcode.OK, p.Writer)
}

// 根据post找评论
func GetCommentBypost(c *gin.Context) {
	id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	var p model.Post
	p.Pid = uint64(id)
	if err := p.GetCommentByPost(); err != nil {
		SendRsp(c, errcode.SearchError, err)
		return
	}
	SendRsp(c, errcode.OK, p.Comment)
}

// 点赞视图函数
func Like(c *gin.Context) {
	// 从查询参数中获取 pid
	postIdStr := c.Query("id")
	fmt.Println(postIdStr)
	pid, err := strconv.ParseUint(postIdStr, 10, 64) // 注意这里使用 ParseUint 而不是 Atoi，因为 Pid 是 uint64
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}

	fmt.Println(pid)
	// 从中间件获取当前用户
	ctx, exists := c.Get("user")
	if !exists {
		SendRsp(c, errcode.ErrcodeInternalError, gin.H{"error": "user context not found"})
		return
	}
	userCtx := ctx.(*token.TokenContext)
	uid := userCtx.Uid
	fmt.Println("uid is", uid)

	//处理like表记录
	if p, err := model.GetLike(uid, pid); err != nil {
		fmt.Println("失败")
		SendRsp(c, errcode.SearchError, nil)
		return
	} else {
		fmt.Println("成功")
		SendRsp(c, errcode.OK, p)
	}
}

func Collect(c *gin.Context) {
	// 从查询参数中获取 pid
	postIdStr := c.Query("id")
	pid, err := strconv.ParseUint(postIdStr, 10, 64) // 注意这里使用 ParseUint 而不是 Atoi，因为 Pid 是 uint64
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}

	// 从中间件获取当前用户
	ctx, exists := c.Get("user")
	if !exists {
		SendRsp(c, errcode.ErrcodeInternalError, gin.H{"error": "user context not found"})
		return
	}
	userCtx := ctx.(*token.TokenContext)
	uid := userCtx.Uid

	//处理like表记录
	if p, err := model.GetCollect(uid, pid); err != nil {
		SendRsp(c, errcode.SearchError, nil)
		return
	} else {

		SendRsp(c, errcode.OK, p)
	}
}

// 添加博文
func Addpost(c *gin.Context) {
	//token信息中获取当前用户
	ctx, exists := c.Get("user")
	if !exists {
		SendRsp(c, errcode.ErrcodeInternalError, gin.H{"error": "user context not found"})
		return
	}
	userCtx := ctx.(*token.TokenContext)

	var p model.Post
	p = model.Post{
		UserId:   userCtx.Uid,
		Title:    c.PostForm("title"),
		Brief:    c.PostForm("brief"),
		Content:  c.PostForm("content"),
		ImageURL: c.PostForm("imageurl"),
	}
	//验证器
	//validate:=validator.New()
	if err := valiutils.ValidateObj.Struct(&p); err != nil {
		SendRsp(c, errcode.DataValidatorError, nil)
		return
	}

	if err := p.Create(); err != nil {
		fmt.Println("数据库错误:", err)
		SendRsp(c, errcode.WriteError, nil)
		return
	}
	SendRsp(c, errcode.OK, p)
}

// 根据pid删除post
func Delpost(c *gin.Context) {
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	p := &model.Post{
		Pid: uint64(id),
	}
	if err := p.Delete(); err != nil {
		SendRsp(c, errcode.DeleteError, nil)
		return
	}
	SendRsp(c, errcode.OK, p)
}

// 修改post信息
func Uppost(c *gin.Context) {
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	s := &model.Post{
		Pid: uint64(id),
	}
	if err := c.ShouldBindJSON(s); err != nil {
		SendRsp(c, errcode.ParamBindError, nil)
		return
	}
	if err := s.Update(); err != nil {
		SendRsp(c, errcode.UpdateError, nil)
		return
	}
	SendRsp(c, errcode.OK, s)
}

// 通过帖子找收藏用户
func GetUserCollectBypost(c *gin.Context) {
	id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	var p model.Post
	p.Pid = uint64(id)
	if err := p.GetUserCollectByPost(); err != nil {
		SendRsp(c, errcode.SearchError, err)
		return
	}
	SendRsp(c, errcode.OK, p.UserCollect)
}

// 上传图片视图函数
func UploadImage(c *gin.Context) {
	file, err := c.FormFile("upload")
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "未接收到文件"})
		return
	}

	// 验证文件类型
	allowedTypes := map[string]bool{
		"image/jpeg": true,
		"image/png":  true,
		"image/gif":  true,
	}
	if !allowedTypes[file.Header.Get("Content-Type")] {
		c.JSON(http.StatusBadRequest, gin.H{"error": "仅支持JPG/PNG/GIF格式"})
		return
	}

	// 生成存储路径
	uploadDir := "static/uploads/" + time.Now().Format("20060102")
	if err := os.MkdirAll(uploadDir, os.ModePerm); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "创建目录失败"})
		return
	}

	// 生成随机文件名
	ext := filepath.Ext(file.Filename)
	newFilename := uuid.New().String() + ext
	filePath := path.Join(uploadDir, newFilename)

	// 保存文件
	if err := c.SaveUploadedFile(file, filePath); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "文件保存失败"})
		return
	}

	// 返回访问路径（根据实际域名调整）
	c.JSON(http.StatusOK, gin.H{
		"url": "/" + filePath,
	})
}
